/**
 * 竞拍 竞价 抢单
 */
package test.temp.suanfa;

import java.util.concurrent.atomic.AtomicInteger;

import hyl.core.MyFun;
import jnr.ffi.Struct.int16_t;

/**
 * 
 * 
 * 2022年9月26日
 * 
 */
public class T抢单 {

	public long l委卖单号;
	public int i拍品;
	public long l挂卖时间戳 = 0;
	public long l抢单时间戳 = 0;
	public long l付款时间戳 = 0;
	UserInfo u卖方;
	UserInfo u买方;
	public long I成本;
	public boolean is有效;// 如果手续费是
	public long I手续费;// 3%
	public int i手续费类型; // 0 :不结算手续费 , 1 :结算手续费 , 2:仓金手续费

	public static final int D挂卖 = 0;
	public static final int D已抢单 = 1;
	public static final int D已付款 = 3;
	public static final int D止拍 = 4;

	public static final int D不结算手续费 = 0;
	public static final int D可结算手续费 = 1;
	public static final int D仓金手续费 = 2;
	public AtomicInteger i抢单状态 = new AtomicInteger(0);

	public static T抢单 get抢单(int 拍品, long 单号, long 售卖时间戳, int 卖方, long 成本, int 买方, int 状态, int 手续费类型, long 抢单时间戳) {

		T抢单 qd = new T抢单(拍品, 单号, 售卖时间戳, 卖方, 手续费类型, 成本);
		qd.u买方 = UserInfo.getUser(买方);
		qd.l抢单时间戳 = 抢单时间戳;
		qd.i抢单状态.set(状态);
		return qd;

	}

//	int i抢单状态;
	public T抢单(int 拍品, long 单号, long 售卖时间戳, int 卖方, int 手续费类型, long 成本) {
		i拍品 = 拍品;
		l委卖单号 = 单号;
		l挂卖时间戳 = 售卖时间戳;
		u卖方 = UserInfo.getUser(卖方);
		I成本 = 成本;
		i抢单状态.set(0);
		i手续费类型 = 手续费类型;
		I手续费 = D参.M奖金(I成本, 2);

	}

	public long get售价() {
		return I成本 * (D参.比例1000 + D参.M酬金系数[1]) / D参.比例1000;
	}

	// ??? 买方抢单以后写入抢单表
	public boolean f抢单(int 买方, int 买方出金) {
		u买方 = UserInfo.getUser(买方);
		long 金额 = get售价();
		long 预付款 = 金额 * D参.i竞拍预付款比 / D参.比例1000;
		if (买方出金 >= 金额) {
			l抢单时间戳 = MyFun.getNs();
			f付款完成();
			// 抢单 付款以后才能止拍
		} else if (i抢单状态.get() == 0 && 买方出金 >= 预付款) {
			i抢单状态.set(D已抢单);
			l抢单时间戳 = MyFun.getNs();

		} else {
			return false;
			// 钱不够不操作
		}
		return true;
	}

	public void f付款完成() {
		i抢单状态.set(D已付款);
		l付款时间戳 = MyFun.getNs();

		new Thread(() -> {
			// 抢单记录插入数据库...
			Long 静态收益 = D参.M奖金(I成本, 3);
			u买方.记用户商城账(l委卖单号, get售价(), D参.D科目_竞拍_扣费, "买方竞拍付款完成");
			u卖方.记抢单静态收益(静态收益, this);

		}).start();
	}

	// ??? 未写:同步数据库
	public void f止拍判断() {

		if (u买方.l累计收益 > this.get售价()) {
		
			T释放 sf = new T释放(MyFun.getMs(), u买方, get售价(), "");
			//插入 释放列表
			i抢单状态.set(D止拍);
		}

	}

}
